package body Actions is

    A1, A2, Data : Donnees;

    procedure Charger_Env is
    begin
        FSIO.Charger_Donnees_Generales("donnees-generales.txt");
        FSIO.Charger_Stock("stock.txt", Data.Stock);
    end Charger_Env;
    
    procedure Charger_Commandes is
    begin
        FSIO.Charger_Commandes("commandes.txt", Data.Liste_Comm);
        Planifier_Commandes;
    end Charger_Commandes;

    procedure Charger_Commandes_Attente is
    begin
        FSIO.Charger_Commandes("commandes-en-attente.txt", Data.Liste_Comm);
    end Charger_Commandes_Attente;    
    
    procedure Afficher_Liste_Commandes is
    begin
        Liste_Commandes.Afficher(Data.Liste_Comm);
    end Afficher_Liste_Commandes;

    procedure Afficher_Liste_Plaques is
    begin
	   Liste_Plaques.Afficher(Data.Stock);
	end Afficher_Liste_Plaques;

    procedure Planifier is
        Menu_Plan : Menu.T_Menu;
    begin
        Menu_Plan := Menu.New_Menu (Title => "Planification des decoupes");
        Menu.New_Item(Menu_Plan, 'P', "Planifier", Planifier_Commandes'Access);
        Menu.New_Item(Menu_Plan, '1', "Valider le plan de découpe A1", Valider_A1'Access);
        Menu.New_Item(Menu_Plan, '2', "Valider le plan de découpe A2", Valider_A2'Access);
        Menu.New_Item(Menu_Plan, 'Q', "Retour", Null);
        
        Menu.Show(Menu_Plan);
    end Planifier;

    procedure Planifier_Commandes is
    begin
        Dupliquer(A1, Data); Dupliquer(A2, Data);
           
        Algo_Normal.Planifier(A1.Stock, A1.Liste_Comm);
        Liste_Commandes.Sousliste_Attente (A1.Liste_Comm, A1.Liste_Comm_Attente);
        Liste_Commandes.Sousliste_Erronees (A1.Liste_Comm, A1.Liste_Comm_Err);
        Sauver("a1", A1);
           
        Algo_Largeur.Planifier(A2.Stock, A2.Liste_Comm);
        Liste_Commandes.Sousliste_Attente (A2.Liste_Comm, A2.Liste_Comm_Attente);
        Liste_Commandes.Sousliste_Erronees (A2.Liste_Comm, A2.Liste_Comm_Err);
        Sauver("a2", A2);
        
        Liste_Commandes.Calculer_Indicateurs(A1.Liste_Comm, A1.Indicateurs);
        Ada.Text_Io.Put("INDICATEURS A1 : " & ASCII.LF & Statistiques.ToString(A1.Indicateurs) & ASCII.LF);
        
        Liste_Commandes.Calculer_Indicateurs(A2.Liste_Comm, A2.Indicateurs);
        Ada.Text_Io.Put("INDICATEURS A2 : " & ASCII.LF & Statistiques.ToString(A2.Indicateurs));
    end Planifier_Commandes;

    procedure Valider_A1 is
    begin
        Dupliquer(Data, A1);
		null;
    end Valider_A1;
    
    procedure Valider_A2 is
    begin
        Dupliquer(Data, A2);
		null;
    end Valider_A2;  
    
    procedure Sauver (Prefixe : in String; D : in out Donnees) is
        Stock_Orig : Liste_Plaques.T_Liste;
    begin
        FSIO.Charger_Stock("stock.txt", Stock_Orig);
        Liste_Plaques_Finales.Generer(D.Liste_Fin, Stock_Orig, D.Liste_Comm);
        
        FSIO.Sauver_Commandes(Prefixe & "-bilan-commandes.txt", D.Liste_Comm);
        FSIO.Sauver_Commandes(Prefixe & "-commandes-en-attente.txt", D.Liste_Comm_Attente);
        FSIO.Sauver_Commandes(Prefixe & "-commandes-erronees.txt", D.Liste_Comm_Err);
        
        FSIO.Sauver_Plan_Decoupe(Prefixe & "-plan-decoupes.txt", D.Liste_Fin);
        FSIO.Sauver_Plaques_XML(Prefixe & "-plan-decoupes.xml", D.Liste_Fin);
        
        FSIO.Sauver_Commandes_Clients(Prefixe & "-commandes-en-attentes-par-client.txt", D.Liste_Comm_Attente);
    end Sauver;        
    
    procedure Sauver_Tout is
    begin
        Sauver("a1", Data); Sauver("a2", Data);
    end Sauver_Tout;  
    
    procedure Annuler_Commande is
        Id_Commande : Natural;
        Comm_Supprimee : Commandes.Commande;
    begin
        Ada.Text_Io.Put_Line("Veuillez saisir le numero de la commande a supprimer : ");
        Ada.Integer_Text_Io.Get(Id_Commande);
        Liste_Commandes.Annuler(Data.Liste_Comm, Data.Stock, Id_Commande, Comm_Supprimee);
    end Annuler_Commande;

    procedure Modifier_Commande is
        Id_Commande : Natural;
        Comm_Supprimee : Commandes.Commande;
        
    	Etat : Commandes.Etat_Commande;
    	Client : String(1..4);
    	Verre : Character;
    	Largeur : Natural;
    	Hauteur : Natural;
    begin
        Ada.Text_Io.Put_Line("Veuillez saisir le numero de la commande a modifier : ");
        Ada.Integer_Text_Io.Get(Id_Commande);
        Liste_Commandes.Annuler(Data.Liste_Comm, Data.Stock, Id_Commande, Comm_Supprimee);
        
        Client := Get_Kbd("Numero de client");
        Verre := Get_Kbd("Categorie de verre");
        Largeur := Get_Kbd("Largeur");
        Hauteur := Get_Kbd("Hauteur");
        
        --Ada.Text_Io.Put_Line(Commandes.ToString());
        
       
    	Etat := Commandes.Verifier (Verre, Largeur, Hauteur);
    	
    	if Etat /= 'A' then
    		Liste_Commandes.Ajouter(Data.Liste_Comm, Commandes.Creer (Id_Commande, Client, Etat));
    	else
			Liste_Commandes.Ajouter(Data.Liste_Comm, Commandes.Creer (Id_Commande, Client, Verre,
												 			 Dim(Largeur,Hauteur)));
		end if;
        
        Planifier;
        
    end Modifier_Commande;

    procedure Dupliquer(Dest : out Donnees; Src : in Donnees) is
    begin
         Dest.Liste_Comm := Liste_Commandes.Copie(Src.Liste_Comm);
         Dest.Liste_Comm_Attente := Liste_Commandes.Copie(Src.Liste_Comm_Attente);
         Dest.Liste_Comm_Err := Liste_Commandes.Copie(Src.Liste_Comm_Err);
         Dest.Liste_Fin := Liste_Plaques_Finales.Liste.Copie(Src.Liste_Fin);
         Dest.Stock := Liste_Plaques.Liste.Copie(Src.Stock); 
    end Dupliquer;
end Actions;